home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1995 #5 & #6 / Amiga Plus CD - 1995 - No. 5 and 6.iso / pd / netz / term / extras / source / gtlayout-source.lha / LTP_LayoutGroup.c < prev    next >
C/C++ Source or Header  |  1995-05-01  |  16KB  |  630 lines

  1. /*  GadTools layout toolkit
  2. **
  3. **  Copyright © 1993-1995 by Olaf `Olsen' Barthel
  4. **  Freely distributable.
  5. */
  6.  
  7. #include "gtlayout_global.h"
  8.  
  9. VOID __regargs
  10. LTP_LayoutGroup(LayoutHandle *Handle,ObjectNode *Group)
  11. {
  12.     if(!Handle -> Failed)
  13.     {
  14.         ObjectNode    *Node;
  15.         ObjectNode    *ReturnKey;
  16.         ObjectNode    *EscKey;
  17.         ObjectNode    *CursorKey;
  18.         ObjectNode    *TabKey;
  19.         LONG         Left;
  20.         LONG         Top;
  21.         LONG         Width;
  22.         LONG         Height;
  23.  
  24.         Left        = 0;
  25.         Top        = 0;
  26.         ReturnKey    = NULL;
  27.         EscKey        = NULL;
  28.         CursorKey    = NULL;
  29.         TabKey        = NULL;
  30.  
  31.         if(Group -> Special . Group . SameSize)
  32.         {
  33.             LONG MaxWidth  = 0;
  34.             LONG MaxHeight = 0;
  35.  
  36.             SCANGROUP(Group,Node)
  37.             {
  38.                 LTP_DetermineSize(Handle,Node);
  39.  
  40.                 if(Node -> Type == BUTTON_KIND)
  41.                 {
  42.                     if(Node -> Special . Button . ReturnKey)
  43.                         ReturnKey = Node;
  44.                     else
  45.                     {
  46.                         if(Node -> Special . Button . EscKey)
  47.                             EscKey = Node;
  48.                     }
  49.                 }
  50.  
  51.                 if(Node -> Type == CYCLE_KIND)
  52.                 {
  53.                     if(Node -> Special . Cycle . TabKey)
  54.                         TabKey = Node;
  55.                 }
  56.  
  57.                 if(Node -> Type == MX_KIND)
  58.                 {
  59.                     if(Node -> Special . Radio . TabKey)
  60.                         TabKey = Node;
  61.                 }
  62.  
  63.                 if(Node -> Type == LISTVIEW_KIND && Node -> Special . List . CursorKey)
  64.                     CursorKey = Node;
  65.  
  66.                 if(Node -> Width > MaxWidth)
  67.                     MaxWidth = Node -> Width;
  68.  
  69.                 if(Node -> Height > MaxHeight)
  70.                     MaxHeight = Node -> Height;
  71.             }
  72.  
  73.             if(ReturnKey)
  74.             {
  75.                 SCANGROUP(Group,Node)
  76.                 {
  77.                     Node -> GroupIndent = TRUE;
  78.  
  79.                     Node -> Width    += 4 + 4;
  80.                     Node -> Height    += 2 + 2;
  81.  
  82.                     if(Node -> Width > MaxWidth)
  83.                         MaxWidth = Node -> Width;
  84.  
  85.                     if(Node -> Height > MaxHeight)
  86.                         MaxHeight = Node -> Height;
  87.                 }
  88.             }
  89.  
  90.             SCANGROUP(Group,Node)
  91.             {
  92.                 if(Node -> Width < MaxWidth)
  93.                 {
  94.                     if(Node -> Type == GROUP_KIND)
  95.                         Node -> Special . Group . ExtraLeft += (MaxWidth - Node -> Width) / 2;
  96.  
  97.                     Node -> Width = MaxWidth;
  98.                 }
  99.  
  100.                 if(Node -> Height < MaxHeight)
  101.                 {
  102.                     if(Node -> Type == GROUP_KIND)
  103.                         Node -> Special . Group . ExtraTop += (MaxHeight - Node -> Height) / 2;
  104.  
  105.                     Node -> Height = MaxHeight;
  106.                 }
  107.             }
  108.         }
  109.         else
  110.         {
  111.             SCANGROUP(Group,Node)
  112.             {
  113.                 LTP_DetermineSize(Handle,Node);
  114.  
  115.                 if(Node -> Type == BUTTON_KIND)
  116.                 {
  117.                     if(Node -> Special . Button . ReturnKey)
  118.                         ReturnKey = Node;
  119.                     else
  120.                     {
  121.                         if(Node -> Special . Button . EscKey)
  122.                             EscKey = Node;
  123.                     }
  124.                 }
  125.  
  126.                 if(Node -> Type == LISTVIEW_KIND && Node -> Special . List . CursorKey)
  127.                     CursorKey = Node;
  128.  
  129.                 if(Node -> Type == CYCLE_KIND)
  130.                 {
  131.                     if(Node -> Special . Cycle . TabKey)
  132.                         TabKey = Node;
  133.                 }
  134.  
  135.                 if(Node -> Type == MX_KIND)
  136.                 {
  137.                     if(Node -> Special . Radio . TabKey)
  138.                         TabKey = Node;
  139.                 }
  140.             }
  141.  
  142.             if(ReturnKey)
  143.             {
  144.                 SCANGROUP(Group,Node)
  145.                 {
  146.                     Node -> GroupIndent = TRUE;
  147.  
  148.                     Node -> Width    += 4 + 4;
  149.                     Node -> Height    += 2 + 2;
  150.                 }
  151.             }
  152.         }
  153.  
  154.         if(Group -> Special . Group . Horizontal)
  155.         {
  156.             LONG x,y,w,MaxTop = 0,MaxWidth = 0,MaxHeight = 0,Count = 0;
  157.  
  158.             if(Group -> Node . mln_Pred -> mln_Pred && Group -> Special . Group . LastAttributes)
  159.             {
  160.                 ObjectNode *LastGroup = (ObjectNode *)Group -> Node . mln_Pred;
  161.  
  162.                 MaxTop        = LastGroup -> Special . Group . MaxOffset;
  163.                 MaxHeight    = LastGroup -> Special . Group . MaxSize;
  164.             }
  165.  
  166.             SCANGROUP(Group,Node)
  167.             {
  168.                 if(!LIKE_STRING_KIND(Node) || Node -> Special . String . LinkID == -1)
  169.                 {
  170.                     if(!Group -> Special . Group . Paging && Count++)
  171.                     {
  172.                         if(Node -> ExtraSpace > 0)
  173.                             x = Left + Node -> ExtraSpace * Handle -> InterWidth;
  174.                         else
  175.                         {
  176.                             if(Node -> ExtraSpace < 0)
  177.                                 x = Left - Node -> ExtraSpace;
  178.                             else
  179.                                 x = Left + Handle -> InterWidth;
  180.                         }
  181.                     }
  182.                     else
  183.                         x = Left;
  184.  
  185.                     y = Top;
  186.                     w = Node -> Width;
  187.  
  188.                     switch(Node -> LabelPlace)
  189.                     {
  190.                         case PLACE_LEFT:
  191.  
  192.                             if(Node -> Type == MX_KIND)
  193.                             {
  194.                                 x += Node -> Special . Radio . LabelWidth + INTERWIDTH;
  195.  
  196.                                 if(Node -> Label)
  197.                                 {
  198.                                     if(Node -> Special . Radio . TitlePlace == PLACETEXT_LEFT)
  199.                                         x += Node -> LabelWidth + INTERWIDTH;
  200.                                     else
  201.                                         w += INTERWIDTH + Node -> LabelWidth;
  202.                                 }
  203.                             }
  204.                             else
  205.                             {
  206.                                 if(Node -> Label || Node -> Type == BOX_KIND)
  207.                                     x += Node -> LabelWidth + INTERWIDTH;
  208.                             }
  209.  
  210.                             break;
  211.  
  212.                         case PLACE_RIGHT:
  213.  
  214.                             if(Node -> Type == MX_KIND)
  215.                             {
  216.                                 w += INTERWIDTH + Node -> Special . Radio . LabelWidth;
  217.  
  218.                                 if(Node -> Label)
  219.                                 {
  220.                                     if(Node -> Special . Radio . TitlePlace == PLACETEXT_LEFT)
  221.                                         x += Node -> LabelWidth + INTERWIDTH;
  222.                                     else
  223.                                         w += INTERWIDTH + Node -> LabelWidth;
  224.                                 }
  225.                             }
  226.                             else
  227.                             {
  228.                                 if(Node -> Label || Node -> Type == BOX_KIND)
  229.                                     w += INTERWIDTH + Node -> LabelWidth;
  230.                             }
  231.  
  232.                             break;
  233.  
  234.                         case PLACE_ABOVE:
  235.  
  236.                             if(Node -> Label || Node -> Type == BOX_KIND)
  237.                             {
  238.                                 if(Node -> Type == LISTVIEW_KIND && Node -> Special . List . TextAttr && Node -> Special . List . FlushLabelLeft)
  239.                                     y += Node -> Special . List . FixedGlyphHeight + INTERHEIGHT;
  240.                                 else
  241.                                     y += Handle -> RPort . TxHeight + INTERHEIGHT;
  242.                             }
  243.  
  244.                             break;
  245.  
  246.                         case PLACE_BELOW:
  247.  
  248.                             break;
  249.  
  250.                         case PLACE_IN:
  251.  
  252.                             break;
  253.                     }
  254.  
  255.                     if(Node -> Type == SLIDER_KIND)
  256.                     {
  257.                         if(Node -> Special . Slider . LevelPlace == PLACETEXT_RIGHT)
  258.                             w += INTERWIDTH + Node -> Special . Slider . LevelWidth;
  259.  
  260.                         if(Node -> Special . Slider . LevelPlace == PLACETEXT_LEFT && Node -> LabelPlace != PLACE_LEFT)
  261.                             x += INTERWIDTH + Node -> Special . Slider . LevelWidth;
  262.                     }
  263.  
  264. #ifdef DO_LEVEL_KIND
  265.                     if(Node -> Type == LEVEL_KIND)
  266.                     {
  267.                         if(Node -> Special . Level . LevelPlace == PLACETEXT_RIGHT)
  268.                             w += INTERWIDTH + Node -> Special . Level . MaxLevelWidth;
  269.  
  270.                         if(Node -> Special . Level . LevelPlace == PLACETEXT_LEFT && Node -> LabelPlace != PLACE_LEFT)
  271.                             x += INTERWIDTH + Node -> Special . Level . MaxLevelWidth;
  272.                     }
  273. #endif    /* DO_LEVEL_KIND */
  274.  
  275.                     if(Node -> Type == LISTVIEW_KIND && Node -> Special . List . ExtraLabelWidth)
  276.                         x += Node -> Special . List . ExtraLabelWidth + INTERWIDTH;
  277.  
  278.                     if(y > MaxTop)
  279.                         MaxTop = y;
  280.  
  281.                     if(Node -> Height > MaxHeight)
  282.                         MaxHeight = Node -> Height;
  283.  
  284.                     if(Node -> LabelPlace == PLACE_BELOW && Node -> Label)
  285.                     {
  286.                         LONG Height;
  287.  
  288.                         if(Node -> Type == LISTVIEW_KIND && Node -> Special . List . TextAttr && Node -> Special . List . FlushLabelLeft)
  289.                             Height = Node -> Height + INTERHEIGHT + Node -> Special . List . FixedGlyphHeight;
  290.                         else
  291.                             Height = Node -> Height + INTERHEIGHT + Handle -> RPort . TxHeight;
  292.  
  293.                         if(Height > MaxHeight)
  294.                             MaxHeight = Height;
  295.                     }
  296.                     else
  297.                     {
  298.                         if(Node -> Height > MaxHeight)
  299.                             MaxHeight = Node -> Height;
  300.                     }
  301.  
  302.                     if(x + w > MaxWidth)
  303.                         MaxWidth = x+w;
  304.  
  305.                     Node -> Left = x;
  306.  
  307.                     if(!Group -> Special . Group . Paging)
  308.                         Left = x + w;
  309.                 }
  310.             }
  311.  
  312.             SCANGROUP(Group,Node)
  313.             {
  314.                 if(!LIKE_STRING_KIND(Node) || Node -> Special . String . LinkID == -1)
  315.                 {
  316.                     Node -> Top = MaxTop;
  317.  
  318.                     if(Node -> Height < MaxHeight)
  319.                     {
  320. #ifdef DO_BOOPSI_KIND
  321.                         if((Node -> Type == PALETTE_KIND && !Node -> Special . Palette . UsePicker) || Node -> Type == LISTVIEW_KIND || (Node -> Type == BOOPSI_KIND && !Node -> Special . BOOPSI . ExactHeight))
  322. #else
  323.                         if((Node -> Type == PALETTE_KIND && !Node -> Special . Palette . UsePicker) || Node -> Type == LISTVIEW_KIND || Node -> Type == BOOPSI_KIND)
  324. #endif    /* DO_BOOPSI_KIND */
  325.                             Node -> Height = MaxHeight;
  326.                         else
  327.                         {
  328.                             if(Node -> Type == GROUP_KIND)
  329.                             {
  330.                                 if(Node -> Special . Group . Spread)
  331.                                     LTP_Spread(Handle,Node,Node -> Width,MaxHeight);
  332.                                 else
  333.                                     Node -> Special . Group . ExtraTop += (MaxHeight - Node -> Height) / 2; /* !FIX! */
  334.  
  335.                                 Node -> Height = MaxHeight;
  336.                             }
  337.                         }
  338.                     }
  339.                 }
  340.             }
  341.  
  342.             Group -> Special . Group . MaxOffset = MaxTop;
  343.             Group -> Special . Group . MaxSize   = MaxHeight;
  344.  
  345.             if(Group -> Special . Group . Paging)
  346.                 Width = MaxWidth;
  347.             else
  348.                 Width = Left;
  349.  
  350.             Height    = MaxTop + MaxHeight;
  351.         }
  352.         else
  353.         {
  354.             LONG x,y,w,MaxLeft = 0,MaxWidth = 0,MaxHeight = 0,Count = 0;
  355.  
  356.             if(Group -> Node . mln_Pred -> mln_Pred && Group -> Special . Group . LastAttributes)
  357.             {
  358.                 ObjectNode *LastGroup = (ObjectNode *)Group -> Node . mln_Pred;
  359.  
  360.                 MaxLeft     = LastGroup -> Special . Group . MaxOffset;
  361.                 MaxWidth    = LastGroup -> Special . Group . MaxSize;
  362.             }
  363.  
  364.             SCANGROUP(Group,Node)
  365.             {
  366.                 if(!LIKE_STRING_KIND(Node) || Node -> Special . String . LinkID == -1)
  367.                 {
  368.                     if(!Group -> Special . Group . Paging && Count++)
  369.                     {
  370.                         if(Node -> ExtraSpace > 0)
  371.                             y = Top + Node -> ExtraSpace * Handle -> InterHeight;
  372.                         else
  373.                         {
  374.                             if(Node -> ExtraSpace < 0)
  375.                                 y = Top - Node -> ExtraSpace;
  376.                             else
  377.                                 y = Top + Handle -> InterHeight;
  378.                         }
  379.                     }
  380.                     else
  381.                         y = Top;
  382.  
  383.                     w = Node -> Width;
  384.                     x = Left;
  385.  
  386.                     switch(Node -> LabelPlace)
  387.                     {
  388.                         case PLACE_LEFT:
  389.  
  390.                             if(Node -> Type == MX_KIND)
  391.                             {
  392.                                 x += Node -> Special . Radio . LabelWidth + INTERWIDTH;
  393.  
  394.                                 if(Node -> Label)
  395.                                 {
  396.                                     if(Node -> Special . Radio . TitlePlace == PLACETEXT_LEFT)
  397.                                         x += Node -> LabelWidth + INTERWIDTH;
  398.                                 }
  399.                             }
  400.                             else
  401.                             {
  402.                                 if(Node -> Label || Node -> Type == BOX_KIND)
  403.                                     x += Node -> LabelWidth + INTERWIDTH;
  404.                             }
  405.  
  406.                             break;
  407.  
  408.                         case PLACE_RIGHT:
  409.  
  410.                             if(Node -> Type == MX_KIND)
  411.                             {
  412.                                 w += INTERWIDTH + Node -> Special . Radio . LabelWidth;
  413.  
  414.                                 if(Node -> Label)
  415.                                 {
  416.                                     if(Node -> Special . Radio . TitlePlace == PLACETEXT_LEFT)
  417.                                         x += Node -> LabelWidth + INTERWIDTH;
  418.                                     else
  419.                                         w += INTERWIDTH + Node -> LabelWidth;
  420.                                 }
  421.                             }
  422.                             else
  423.                             {
  424.                                 if(Node -> Label || Node -> Type == BOX_KIND)
  425.                                     w += INTERWIDTH + Node -> LabelWidth;
  426.                             }
  427.  
  428.                             break;
  429.  
  430.                         case PLACE_ABOVE:
  431.  
  432.                             if(Node -> Label || Node -> Type == BOX_KIND)
  433.                             {
  434.                                 if(Node -> Type == LISTVIEW_KIND && Node -> Special . List . TextAttr && Node -> Special . List . FlushLabelLeft)
  435.                                     y += Node -> Special . List . FixedGlyphHeight + INTERHEIGHT;
  436.                                 else
  437.                                     y += Handle -> RPort . TxHeight + INTERHEIGHT;
  438.                             }
  439.  
  440.                             break;
  441.  
  442.                         case PLACE_BELOW:
  443.  
  444.                             break;
  445.  
  446.                         case PLACE_IN:
  447.  
  448.                             break;
  449.                     }
  450.  
  451.                     if(Node -> Type == SLIDER_KIND)
  452.                     {
  453.                         if(Node -> Special . Slider . LevelPlace == PLACETEXT_RIGHT)
  454.                             w += INTERWIDTH + Node -> Special . Slider . LevelWidth;
  455.  
  456.                         if(Node -> Special . Slider . LevelPlace == PLACETEXT_LEFT && Node -> LabelPlace != PLACE_LEFT)
  457.                             x += INTERWIDTH + Node -> Special . Slider . LevelWidth;
  458.                     }
  459.  
  460. #ifdef DO_LEVEL_KIND
  461.                     if(Node -> Type == LEVEL_KIND)
  462.                     {
  463.                         if(Node -> Special . Level . LevelPlace == PLACETEXT_RIGHT)
  464.                             w += INTERWIDTH + Node -> Special . Level . MaxLevelWidth;
  465.  
  466.                         if(Node -> Special . Level . LevelPlace == PLACETEXT_LEFT && Node -> LabelPlace != PLACE_LEFT)
  467.                             x += INTERWIDTH + Node -> Special . Level . MaxLevelWidth;
  468.                     }
  469. #endif    /* DO_LEVEL_KIND */
  470.                     if(Node -> Type == LISTVIEW_KIND && Node -> Special . List . ExtraLabelWidth)
  471.                         x += Node -> Special . List . ExtraLabelWidth + INTERWIDTH;
  472.  
  473.                     if(x > MaxLeft)
  474.                         MaxLeft = x;
  475.  
  476.                     if(w > MaxWidth)
  477.                         MaxWidth = w;
  478.  
  479.                     if(y + Node -> Height > MaxHeight)
  480.                         MaxHeight = y + Node -> Height;
  481.  
  482.                     Node -> Top = y;
  483.  
  484.                     if(!Group -> Special . Group . Paging)
  485.                         Top = y + Node -> Height;
  486.  
  487.                     if(Node -> LabelPlace == PLACE_BELOW && Node -> Label)
  488.                     {
  489.                         if(Node -> Type == LISTVIEW_KIND && Node -> Special . List . TextAttr && Node -> Special . List . FlushLabelLeft)
  490.                             Top += INTERHEIGHT + Node -> Special . List . FixedGlyphHeight;
  491.                         else
  492.                             Top += INTERHEIGHT + Handle -> RPort . TxHeight;
  493.                     }
  494.                 }
  495.             }
  496.  
  497.             SCANGROUP(Group,Node)
  498.             {
  499.                 if(!LIKE_STRING_KIND(Node) || Node -> Special . String . LinkID == -1)
  500.                 {
  501.                     Node -> Left = MaxLeft;
  502.  
  503.                     if(Node -> Type == GROUP_KIND && Group -> Special . Group . Paging)
  504.                         Node -> Special . Group . ExtraTop += (MaxHeight - Node -> Height) / 2;
  505.  
  506.                     if(Node -> Width < MaxWidth)
  507.                     {
  508.                         if(Node -> Type == GROUP_KIND)
  509.                         {
  510.                             if(Node -> Special . Group . Spread)
  511.                                 LTP_Spread(Handle,Node,MaxWidth,Node -> Height);
  512.                             else
  513.                                 Node -> Special . Group . ExtraLeft += (MaxWidth - Node -> Width) / 2;
  514.  
  515.                             Node -> Width = MaxWidth;
  516.                         }
  517.                         else
  518.                         {
  519. #ifdef DO_BOOPSI_KIND
  520.                             if((Node -> Type == PALETTE_KIND && !Node -> Special . Palette . UsePicker) || (Node -> Type == BOOPSI_KIND && !Node -> Special . BOOPSI . ExactWidth) || Node -> Type == LISTVIEW_KIND || Node -> Type == TEXT_KIND || Node -> Type == GAUGE_KIND || Node -> Type == NUMBER_KIND || Node -> Type == CYCLE_KIND || LIKE_STRING_KIND(Node) || Node -> Type == INTEGER_KIND || Node -> Type == BUTTON_KIND || Node -> Type == SLIDER_KIND || Node -> Type == BOX_KIND || Node -> Type == SCROLLER_KIND || Node -> Type == LEVEL_KIND)
  521. #else
  522.                             if((Node -> Type == PALETTE_KIND && !Node -> Special . Palette . UsePicker) || Node -> Type == LISTVIEW_KIND || Node -> Type == TEXT_KIND || Node -> Type == GAUGE_KIND || Node -> Type == NUMBER_KIND || Node -> Type == CYCLE_KIND || LIKE_STRING_KIND(Node) || Node -> Type == INTEGER_KIND || Node -> Type == BUTTON_KIND || Node -> Type == SLIDER_KIND || Node -> Type == BOX_KIND || Node -> Type == SCROLLER_KIND || Node -> Type == LEVEL_KIND)
  523. #endif    /* DO_BOOPSI_KIND */
  524.                             {
  525.                                 if((Node -> Type != LISTVIEW_KIND || !Node -> Special . List . LockSize) && (Node -> Type != TEXT_KIND || !Node -> Special . Text . LockSize))
  526.                                 {
  527.                                     if(Node -> Label && Node -> LabelPlace == PLACE_RIGHT)
  528.                                         Node -> Width = MaxWidth - (INTERWIDTH + Node -> LabelWidth);
  529.                                     else
  530.                                         Node -> Width = MaxWidth;
  531.                                 }
  532.                             }
  533.                             else
  534.                             {
  535.                                 if(Node -> Type == SLIDER_KIND)
  536.                                 {
  537.                                     if(Node -> Special . Slider . LevelPlace == PLACE_RIGHT)
  538.                                     {
  539.                                         if(Node -> Width + Node -> Special . Slider . LevelWidth + INTERWIDTH < MaxWidth)
  540.                                             Node -> Width = MaxWidth - (Node -> Special . Slider . LevelWidth + INTERWIDTH);
  541.                                     }
  542.                                     else
  543.                                         Node -> Width = MaxWidth;
  544.                                 }
  545.  
  546. #ifdef DO_LEVEL_KIND
  547.                                 if(Node -> Type == LEVEL_KIND)
  548.                                 {
  549.                                     if(Node -> Special . Level . LevelPlace == PLACE_RIGHT)
  550.                                     {
  551.                                         if(Node -> Width + Node -> Special . Level . MaxLevelWidth + INTERWIDTH < MaxWidth)
  552.                                             Node -> Width = MaxWidth - (Node -> Special . Level . MaxLevelWidth + INTERWIDTH);
  553.                                     }
  554.                                     else
  555.                                         Node -> Width = MaxWidth;
  556.                                 }
  557. #endif    /* DO_LEVEL_KIND */
  558.                             }
  559.                         }
  560.                     }
  561.                 }
  562.             }
  563.  
  564.             Group -> Special . Group . MaxOffset  = MaxLeft;
  565.             Group -> Special . Group . MaxSize    = MaxWidth;
  566.  
  567.             if(Group -> Special . Group . Paging)
  568.                 Height = MaxHeight;
  569.             else
  570.                 Height = Top;
  571.  
  572.             Width = MaxLeft + MaxWidth;
  573.         }
  574.  
  575.         Group -> Left    = 0;
  576.         Group -> Top    = 0;
  577.         Group -> Width    = Width;
  578.         Group -> Height = Height;
  579.  
  580.         if(Group -> Label || Group -> Special . Group . Frame)
  581.         {
  582.             if(Group -> Label)
  583.             {
  584.                 Group -> LabelWidth = LT_LabelWidth(Handle,Group -> Label) + 2 * Handle -> GlyphWidth;
  585.  
  586.                 Group -> Height += Handle -> RPort . TxHeight + 2 * Handle -> InterHeight + 3;
  587.             }
  588.             else
  589.             {
  590.                 Group -> LabelWidth = 0;
  591.  
  592.                 Group -> Height += 2 + 2 * Handle -> InterHeight + 3;
  593.             }
  594.  
  595.             if(Group -> LabelWidth > Group -> Width)
  596.             {
  597.                 Group -> Special . Group . ExtraLeft += (Group -> LabelWidth - Group -> Width) / 2;
  598.  
  599.                 Group -> Width = Group -> LabelWidth;
  600.             }
  601.  
  602.             Group -> Width += 2 * (Handle -> GlyphWidth + Handle -> InterWidth) + 8;
  603.         }
  604.  
  605.         if(Group -> Special . Group . IndentX)
  606.         {
  607.             Group -> Width                += 2 * Handle -> InterWidth;
  608.             Group -> Special . Group . ExtraLeft    += Handle -> InterWidth;
  609.         }
  610.  
  611.         if(Group -> Special . Group . IndentY)
  612.         {
  613.             Group -> Height                += 2 * Handle -> InterHeight;
  614.             Group -> Special . Group . ExtraTop    += Handle -> InterHeight;
  615.         }
  616.  
  617.         if(ReturnKey)
  618.             Handle -> ReturnKey = ReturnKey;
  619.  
  620.         if(EscKey)
  621.             Handle -> EscKey = EscKey;
  622.  
  623.         if(CursorKey)
  624.             Handle -> CursorKey = CursorKey;
  625.  
  626.         if(TabKey)
  627.             Handle -> TabKey = TabKey;
  628.     }
  629. }
  630.